package syspizza.tableModel;

import java.lang.reflect.Method;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class TableModelGenerico <T> extends AbstractTableModel {
    private T entity;
    private final List<T> lista;
    private Class<T> classe;

    public TableModelGenerico(List<T> lista)  {
        this.lista = lista;
        if (this.lista.size() >0) {
            this.classe = (Class<T>) lista.get(0).getClass();
        }
    }

    @Override
    public int getRowCount() {
        return this.lista.size();
    }

    @Override
    public int getColumnCount() {
        int colunas = 0;
        
        if (this.lista.isEmpty()){
            return 0;
        }
        //muito foda, vai identificar todas as anotacoes coluna
        for (Method metodo : classe.getDeclaredMethods()) {
            if (metodo.isAnnotationPresent(Coluna.class)) {
                colunas++;
            }
        }
        return colunas;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {

        Object objeto = lista.get(rowIndex);
        for (Method metodo : classe.getDeclaredMethods()) {
            if (metodo.isAnnotationPresent(Coluna.class)) {
                Coluna anotacao = metodo.getAnnotation(Coluna.class);
                int pos = anotacao.posicao();
                if (pos == columnIndex) {
                    try {
                        Object ob = metodo.invoke(objeto);
                        //aqui formata caso seja valor de retorno float
                        if (metodo.getReturnType().equals(Float.TYPE)) {
                            NumberFormat format = new DecimalFormat("###,##0.00");
                            String s = format.format((float) ob);
                            return s;
                        }
                        
                        if(metodo.getReturnType().equals(Date.class)){
                            SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");                            
                            String s = format.format((Date)ob);
                            return s;
                        }
                        return ob;
                    } catch (Exception e) {
                        return "Não foi possível carregar valor";
                    }
                }
            }
        }
        return "";
    }

    @Override
    public String getColumnName(int column) {
        for (Method metodo : classe.getDeclaredMethods()) {
            if (metodo.isAnnotationPresent(Coluna.class)) {
                Coluna anotacao = metodo.getAnnotation(Coluna.class);
                if (anotacao.posicao() == column) {
                    return anotacao.rotulo();
                }
            }
        }
        return "";
    }
    
    public List<T> getList(){
        return this.lista;
    }

}
